package com.softeem.sanguo;

import java.awt.*;
import java.util.Timer;
import java.util.TimerTask;

/**
 * 敌人类：表示与玩家对抗的对手
 */
public class Enemy extends Sprite implements Runnable{

    //声明敌人移动速度
    private int speed;
    //初始敌人血量
    int hp = 100;
    //声明定时器
    Timer timer;
    //声明敌人是否携带道具
    boolean prop;
    //声明状态，标记敌人是否被玩家攻击死亡
    boolean kill;

    /**
     * 敌人移动定时任务：定时修改用于渲染敌人图片
     */
    private class MoveTask extends TimerTask{
        //初始化敌人图片索引
        private int index = 0;
        @Override
        public void run() {
            //修改敌人图片
            setImg(Images.enemy[++index % Images.enemy.length]);
        }
    }

    /**
     * 构造器：在创建对象时执行初始化操作
     *
     * @param panel
     */
    public Enemy(GamePanel panel) {
        super(panel);
    }

    @Override
    public void init() {
        //设置初始敌人图片
        setImg(Images.enemy[0]);
        //设置敌人宽高
        setW(getImg().getWidth());
        setH(getImg().getHeight());
        //设置敌人坐标
        setX(Config.SC_WIDTH);
        //计算获取随机y坐标的范围
        int min = Config.SC_HEIGHT/2 - getH()/2;
        int max = Config.SC_HEIGHT - getH() * 2;
        //随机敌人y坐标
        setY(Utils.randomNum(min,max));
        //随机敌人的移动速度
        this.speed = Utils.randomNum(5,15);
        //根据随机数设定敌人是否携带道具
        this.prop = Utils.randomNum(1,100)/100.0 <= Config.PROP_RATE;

        //创建定时器对象
        timer = new Timer();
        //创建定时任务对象
        MoveTask task = new MoveTask();
        //立即执行定时任务，每隔0.05秒调度一次
        timer.schedule(task,0,50);
    }

    @Override
    public void run() {
        //循环修改敌人的x坐标
        while(!isDeath()){
            //修改敌人的x坐标
            setX(getX() - speed);
            if(getX() < -getW()){
                //敌人已经移动到屏幕的最左边（线程中断：标记中断）
                setDeath(true);
            }
            //获取玩家对象
            Hero h = getPanel().hero;
            //检测当前敌人和玩家是否碰撞
            if(Utils.isHit(getX(),getY(),getW(),getH(),h.getX(),h.getY(),h.getW(),h.getH()) && !h.isDeath()){
                //随机减少一定血量
                int dec = Utils.randomNum(1,5);
                h.hp -= dec;
                if(h.hp <= 0){
                    //标记死亡
                    h.setDeath(true);
                    //执行销毁操作
                    h.destroy();
                }
            }
            try {
                //每隔0.1秒移动一次
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        //销毁敌人
        destroy();
    }

    /**
     * 重写绘制方法，在已经绘制的敌人基础上增加血槽
     * @param g
     */
    @Override
    public void draw(Graphics g) {
        //勿删：绘制敌人图片
        super.draw(g);
        //设置画笔颜色
        g.setColor(Color.RED);
        //绘制血条(坐标，宽高) - 血槽
        g.drawRect(getX(),getY()-10,getW(),5);
        //填充血条  实际血量/总血量 * 宽度
        g.fillRect(getX(),getY()-10,(int)((hp / Config.ENEMY_MAX_HP) * getW()),5);
    }

    @Override
    public void destroy() {
        //停止敌人的定时任务
        timer.cancel();
        //判断敌人是否携带道具，并根据状态决定是否创建道具
        if(kill && prop){
            //创建道具
           Food f = new Food(getPanel(),getX(),getY());
           //将产生的道具添加到集合中
            getPanel().foods.add(f);
        }
        //清理敌人：从集合中删除元素
        getPanel().enemies.remove(this);
    }

}
